

package com.beans;


import com.entidades.ListadoApuestas;
import com.entidades.Apuestas;
import com.entidades.Jugadas;
import com.entidades.Jugadaspordia;
import com.entidades.Movimientos;
import com.entidades.TablaImportes;
import java.io.Serializable;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.el.ELException;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import javax.transaction.NotSupportedException;
import javax.transaction.RollbackException;
import javax.transaction.SystemException;
import javax.transaction.Transactional;
import javax.transaction.UserTransaction;

    
/**
 * <p>A simple managed bean to mediate between the user
 * and the persistence layer.</p>
 * @author rlubke
 */
@Named("cEnt")
public class controlEntidades  implements Serializable {
    /**
     * <p>The <code>PersistenceContext</code>.</p>
     */
    @PersistenceContext 
    private EntityManager em;
    
    /**
     * <p>The transaction resource.</p>
     */
    @Resource 
    private UserTransaction utx2;

    @PostConstruct
    private void init(){
        
        vListaMovimientos = new ArrayList<>();  
        //vListaApuestas = new ArrayList<>();  
                
        vListaMovimientos = findAllMovimientos();
        //vListaApuestas = findAllApuestas();
    }
    
    //variables de apuestas
    private Integer idApuesta;
    private Date apuFecha;
    private Integer apuJugada;
    private BigDecimal apuPremio;
    private Integer apuRetencion;
    private Integer apuEstado;
    
    private List<ListadoApuestas> vListaApuestas;
    private ListadoApuestas SelectedApu;
    public List<Jugadaspordia> vListaJugadasPorDia;
    
    //variables de movimientos
    private Integer idReg;
    private Date movFecha;
    private String movTipo;
    private BigDecimal movImporte;
    
    private BigDecimal SumMovImporte;
    
    private List<Movimientos> vListaMovimientos;
    private Movimientos SelectedMov;

    public List<Jugadaspordia> getvListaJugadasPorDia() {
        
        return vListaJugadasPorDia;
    }

    public void setvListaJugadasPorDia(List<Jugadaspordia> vListaJugadasPorDia) {
        this.vListaJugadasPorDia = vListaJugadasPorDia;
    }

    public BigDecimal getSumMovImporte() {
        SumMovImporte = getTablaImportes().getSaldo();
        return SumMovImporte;
    }

    public void setSumMovImporte(BigDecimal SumMovImporte) {
        this.SumMovImporte = SumMovImporte;
    }

    public Integer getIdReg() {
        return idReg;
    }

    public void setIdReg(Integer idReg) {
        this.idReg = idReg;
    }

    public Date getMovFecha() {
        return movFecha;
    }

    public void setMovFecha(Date movFecha) {
        this.movFecha = movFecha;
    }

    public String getMovTipo() {
        return movTipo;
    }

    public void setMovTipo(String movTipo) {
        this.movTipo = movTipo;
    }

    public BigDecimal getMovImporte() {
        return movImporte;
    }

    public void setMovImporte(BigDecimal movImporte) {
        this.movImporte = movImporte;
    }

    public List<Movimientos> getvListaMovimientos() {
        return vListaMovimientos;
    }

    public void setvListaMovimientos(List<Movimientos> vListaMovimientos) {
        this.vListaMovimientos = vListaMovimientos;
    }

    public Movimientos getSelectedMov() {
        return SelectedMov;
    }

    public void setSelectedMov(Movimientos SelectedMov) {
        this.SelectedMov = SelectedMov;
    }
    
    
    private Date fechaAhora;
    private Date fechaProximoViernes;

    public Date getFechaProximoViernes() {
        
        GregorianCalendar cal = new GregorianCalendar();
	cal.setTime(fechaAhora);
        System.out.println("Dia de la semana actual: " + cal.get(Calendar.DAY_OF_WEEK));
        if(cal.get(Calendar.DAY_OF_WEEK) == 5){
            fechaProximoViernes = cal.getTime();
            return fechaProximoViernes;    
        }else{
            for(int i=1;i<10;i++){
                cal.add(Calendar.DAY_OF_MONTH, 1);
                if(cal.get(Calendar.DAY_OF_WEEK) == 5){
                    fechaProximoViernes = cal.getTime();
                    return fechaProximoViernes;    
                }
            }
        }
        return fechaProximoViernes;    
    }

    public void setFechaProximoViernes(Date fechaProximoViernes) {
        this.fechaProximoViernes = fechaProximoViernes;
    }

    public Integer getIdApuesta() {
        return idApuesta;
    }

    public void setIdApuesta(Integer idApuesta) {
        this.idApuesta = idApuesta;
    }

    public Date getApuFecha() {
        return apuFecha;
    }

    public void setApuFecha(Date apuFecha) {
        this.apuFecha = apuFecha;
    }

    public Integer getApuJugada() {
        return apuJugada;
    }

    public void setApuJugada(Integer apuJugada) {
        this.apuJugada = apuJugada;
    }

    public BigDecimal getApuPremio() {
        return apuPremio;
    }

    public void setApuPremio(BigDecimal apuPremio) {
        this.apuPremio = apuPremio;
    }

    public Integer getApuRetencion() {
        return apuRetencion;
    }

    public void setApuRetencion(Integer apuRetencion) {
        this.apuRetencion = apuRetencion;
    }

    public Integer getApuEstado() {
        return apuEstado;
    }

    public void setApuEstado(Integer apuEstado) {
        this.apuEstado = apuEstado;
    }

    public ListadoApuestas getSelectedApu() {
        return SelectedApu;
    }

    public void setSelectedApu(ListadoApuestas SelectedApu) {
        this.SelectedApu = SelectedApu;
    }

    public Date getFechaAhora() {
        fechaAhora = new Date();
        return fechaAhora;
    }

    public void setFechaAhora(Date fechaAhora) {
        this.fechaAhora = fechaAhora;
    }
    
    
    
    public List<ListadoApuestas> getvListaApuestas() {
        vListaApuestas = findAllApuestas();
        return vListaApuestas;
    }

    public void setvListaApuestas(List<ListadoApuestas> vListaApuestas) {
        this.vListaApuestas = vListaApuestas;
    }
    
    
    public void createApuesta() {
        FacesContext context = FacesContext.getCurrentInstance();
        Apuestas wneg = new Apuestas();

        //wneg.setIdApuesta(idApuesta);
        wneg.setApuFecha(apuFecha);
        wneg.setApuJugada(apuJugada);
        wneg.setApuRetencion(apuRetencion);
        wneg.setApuPremio(apuPremio);
        wneg.setApuEstado(apuEstado);

        
        
            try {
                utx2.begin();
                em.persist(wneg);
                utx2.commit();
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    context.getApplication().evaluateExpressionGet(context, "Apuestas dada de alta!", String.class)
                        ,context.getApplication().evaluateExpressionGet(context, "Puedes verla en el listado de apuestas.", String.class));
                context.addMessage("creategrowl", message);
                
                
                //Carga la lista de solicitudes
                vListaApuestas = findAllApuestas();
               
                Map sMap;
                sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
                //pone la variable de sesion "SPAGINA" para que sea index
                //y actualiza esAdmin y lo activa a true
                controlPrincipal bm = (controlPrincipal) sMap.get("cPri");
                bm.pagCentro = "index";
                
            } catch (NotSupportedException | SystemException | RollbackException | HeuristicMixedException | HeuristicRollbackException | SecurityException | IllegalStateException | ELException e) {               
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                        "Error creating request!",
                                                        "Unexpected error when creating your request.  Please contact the system Administrator");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Unable to create new request",
                                                e);
                //return null;
            }     
        }
    
    
    public void createMovimiento() {
        FacesContext context = FacesContext.getCurrentInstance();
        Movimientos wneg = new Movimientos();

        //wneg.setIdReg(idReg);
        wneg.setMovFecha(new Date(fechaFormatoMySQL(fechaAhora)));
        wneg.setMovImporte(movImporte);
        wneg.setMovTipo(movTipo);
       
        
            try {
                utx2.begin();
                em.persist(wneg);
                utx2.commit();
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    context.getApplication().evaluateExpressionGet(context, "Movimiento dado de alta!", String.class)
                        ,context.getApplication().evaluateExpressionGet(context, "Puedes verlo en el listado de movimientos.", String.class));
                context.addMessage("creategrowl", message);
                
                
                //Carga la lista de solicitudes
                vListaMovimientos = findAllMovimientos();
               
                Map sMap;
                sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
                controlPrincipal bm = (controlPrincipal) sMap.get("cPri");
                bm.pagCentro = "index";
                
            } catch (NotSupportedException | SystemException | RollbackException | HeuristicMixedException | HeuristicRollbackException | SecurityException | IllegalStateException | ELException e) {               
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                        "Error creating request!",
                                                        "Unexpected error when creating your request.  Please contact the system Administrator");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Unable to create new request",
                                                e);
                //return null;
            }     
        }
    
    
        public List<ListadoApuestas> findAllApuestas() {
            Query query = em.createNamedQuery("ListadoApuestas.findAll");
            List<ListadoApuestas> tmpApuestas = query.getResultList();
            return tmpApuestas;
        }
        
        public List<Movimientos> findAllMovimientos() {
            Query query = em.createNamedQuery("Movimientos.findAll");
            List<Movimientos> tmpMovimientos = query.getResultList();
            return tmpMovimientos;
        }
        
        public void rellenaJugadasporDia(Date fecha) {
            Query query = em.createNamedQuery("Jugadaspordia.findByApuFecha").setParameter("apuFecha", fecha);
            vListaJugadasPorDia = new ArrayList<>();
            vListaJugadasPorDia = query.getResultList();
            System.out.println("Ha rellenado jugadas por dia: fecha = " + fecha);
            System.out.println("Ha rellenado jugadas por dia: " + vListaJugadasPorDia.size());
            System.out.println("Ha rellenado jugadas por dia: " + vListaJugadasPorDia.get(0).getApuFecha());
        }
        
        public Apuestas findApuestaPorID(Integer idApu) {
            Query query = em.createNamedQuery("Apuestas.findByIdApuesta").setParameter("idApuesta", idApu);
            return (Apuestas)query.getSingleResult();
        }
        
        public BigDecimal sumAllMovimientos() {
            Query query = em.createNamedQuery("Movimientos.findBySumAllMov");
            return (BigDecimal)query.getSingleResult();
        }
        
        public TablaImportes getTablaImportes() {
            Query query = em.createNamedQuery("TablaImportes.findAll");
            return (TablaImportes)query.getSingleResult();
        }
        
        public BigDecimal sumPremiosPorDia(Date fecha) {
            Query query = em.createNamedQuery("Jugadaspordia.findSumPremiosDia").setParameter("apuFecha", fecha);;
            return (BigDecimal)query.getSingleResult();
        }
        
        public void aplicarPremio(Integer idApu, BigDecimal apuPre){
            
            System.out.println("Aplicando premio de idApu: " + idApu + " con valor: " + apuPre);
            FacesContext context = FacesContext.getCurrentInstance();
      
            try {
                utx2.begin();
                Apuestas wneg = findApuestaPorID(idApu);
                wneg.setApuPremio(apuPre);
                wneg.setApuEstado(1);
                utx2.commit();
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    context.getApplication().evaluateExpressionGet(context, "Premio de apuesta actualizado!", String.class)
                        ,context.getApplication().evaluateExpressionGet(context, " ", String.class));
                context.addMessage("creategrowl", message);
                
                //Carga la lista de solicitudes
                vListaApuestas = findAllApuestas();
               
                Map sMap;
                sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
                //pone la variable de sesion "SPAGINA" para que sea index
                //y actualiza esAdmin y lo activa a true
                //controlPrincipal bm = (controlPrincipal) sMap.get("cPri");
                //bm.pagCentro = "index";
                
            } catch (NotSupportedException | SystemException | RollbackException | HeuristicMixedException | HeuristicRollbackException | SecurityException | IllegalStateException | ELException e) {               
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                        "Error creating request!",
                                                        "Unexpected error when creating your request.  Please contact the system Administrator");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Unable to create new request",
                                                e);
                //return null;
            }     
        }
        
        public String fechaFormato(Date fecha){
            
            String formato = "";
            if(fecha != null){
                formato = new SimpleDateFormat("dd/MM/yyyy").format(fecha);
            }
            return formato;
        }
        
        public String fechaFormatoMySQL(Date fecha){
            
            String formato = "";
            if(fecha != null){
                formato = new SimpleDateFormat("MM/dd/yyyy").format(fecha);
            }
            return formato;
        }
        
        public void crearApuestaEstandar(){
            FacesContext context = FacesContext.getCurrentInstance();
            Apuestas wneg = new Apuestas();

            //wneg.setIdApuesta(idApuesta);
            wneg.setApuFecha(new Date(fechaFormatoMySQL(getFechaProximoViernes())));
            wneg.setApuRetencion(0);
            wneg.setApuPremio(BigDecimal.valueOf(0));
            wneg.setApuEstado(0);
        
            
            Movimientos wneg2 = new Movimientos();

            wneg2.setMovFecha(new Date(fechaFormatoMySQL(fechaAhora)));
            wneg2.setMovTipo("APUESTA ESTANDAR " + fechaFormato(getFechaProximoViernes()));
            wneg2.setMovImporte(BigDecimal.valueOf(-8));
        
            try {
                 for(int i = 1 ; i <= 4 ; i++){
                    wneg.setApuJugada(i);
                    utx2.begin();
                    em.persist(wneg);
                    utx2.commit();
                 }
                 utx2.begin();
                 em.persist(wneg2);
                 utx2.commit();
                
            } catch (NotSupportedException | SystemException | RollbackException | HeuristicMixedException | HeuristicRollbackException | SecurityException | IllegalStateException | ELException e) {               
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,
                                                        "Error creating request!",
                                                        "Unexpected error when creating your request.  Please contact the system Administrator");
                context.addMessage(null, message);
                Logger.getAnonymousLogger().log(Level.SEVERE,
                                                "Unable to create new request",
                                                e);
                //return null;
            } 
                
                FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_INFO,
                    context.getApplication().evaluateExpressionGet(context, "Apuesta dada de alta!", String.class)
                        ,context.getApplication().evaluateExpressionGet(context, "Puedes verla en el listado de apuestas.", String.class));
                context.addMessage("creategrowl", message);
                
                
                //Carga la lista de solicitudes
                vListaApuestas = findAllApuestas();
               
                Map sMap;
                sMap = FacesContext.getCurrentInstance().getExternalContext().getSessionMap();
                //pone la variable de sesion "SPAGINA" para que sea index
                //y actualiza esAdmin y lo activa a true
                controlPrincipal bm = (controlPrincipal) sMap.get("cPri");
                bm.pagCentro = "index";    
            
        }
        
}
